package com.lp.business.function;

import java.io.StringWriter;
import java.util.Date;
import java.util.Random;

import org.apache.commons.lang.time.DateFormatUtils;
import org.iframework.commons.util.fast.V;
import org.iframework.support.spring.function.BaseCommonUtil;

import net.sourceforge.pinyin4j.PinyinHelper;

/**
 * 业务工具方法
 * 
 * @author lipeng
 * 
 */
public class BaseBusinessUtil extends BaseCommonUtil {
	
	/**
	 * 提取每个汉字的首字母(大写)
	 *
	 * @param str
	 * @return
	 */
	public static String getPinYinHeadChar(String str) {
		if (V.isEmpty(str)) {
			return "";
		}
		String convert = "";
		for (int j = 0; j < str.length(); j++) {
			char word = str.charAt(j);
			// 提取汉字的首字母
			String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
			if (pinyinArray != null) {
				convert += pinyinArray[0].charAt(0);
			} else {
				convert += word;
			}
		}

		convert = string2AllTrim(convert);
		return convert.toUpperCase();
	}

	/**
	 * 去掉字符串包含的所有空格
	 *
	 * @param value
	 * @return
	 */
	public static String string2AllTrim(String value) {
		if (V.isEmpty(value)) {
			return "";
		}
		return value.trim().replace(" ", "");
	}


	
	public static String getRandomString(int count) {
		String base = "abcdefghijklmnopqrstuvwxyz0123456789";
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		count=(count==0)?4:count;
		for (int i = 0; i < count; i++) {
			int number = random.nextInt(base.length());
			sb.append(base.charAt(number));
		}
		return sb.toString();
	}

	/**
	 * 过滤特殊字符
	 * 
	 * @param source
	 *            过滤前字符串
	 * @return 解码后的字符串
	 */
	public static String replaceSpecialChar(String source) {
		if (V.isEmpty(source)) {
			return "";
		}
		source = source.trim();
		source = source.replace("\\", "");
		source = source.replaceAll("\r|\n|\t", "");
		// 如果有新的特殊字符需要替换可以直接加一个
		return source;
	}

	/**
	 * 解码特殊字符(ascii)
	 * 
	 * @param str
	 *            解码前字符串
	 * @return 解码后的字符串
	 */
	public static String unEscape(String str) {
		try {
			// 判断字符串是否为空,为空时直接返回原数据
			if (V.isEmpty(str)) {
				return str;
			}
			// 获取&的下标位置
			int firstAmp = str.indexOf('&');
			if (firstAmp < 0)
				return str;
			// 字符串转为 StringWriter
			StringWriter stringWriter = new StringWriter(
					(int) ((double) str.length() + (double) str.length() * 0.10000000000000001D));
			// 保存下标0 - firstAmp位置的字符串
			stringWriter.write(str, 0, firstAmp);
			// 获取字符串字符长度
			int len = str.length();
			// 从firstAmp 开始循环字符串
			for (int i = firstAmp; i < len; i++) {
				// 获取单个字符
				char c = str.charAt(i);
				// 判断单个字符是否是&,为 true 时，进行转码操作
				if (c == '&') {
					// 设置查找分号的开始位置：&下标位置+1
					int nextIdx = i + 1;
					// 查找分号是否存在
					int semiColonIdx = str.indexOf(';', nextIdx);
					// 分号不存在时直接输出字符
					if (semiColonIdx == -1) {
						stringWriter.write(c);
						continue;
					}
					// 判断字符串中是否存在&
					int amphersandIdx = str.indexOf('&', i + 1);
					if (amphersandIdx != -1 && amphersandIdx < semiColonIdx) {
						stringWriter.write(c);
						continue;
					}
					// 截取字符串： 从&开始到分号结束
					String entityContent = str.substring(nextIdx, semiColonIdx);
					int entityValue = -1;
					// 截取到的字符串的长度
					int entityContentLen = entityContent.length();
					// 判断字符串长度是否大于0
					if (entityContentLen > 0) {
						// 删除字符串中空格
						entityContent = entityContent.replaceAll(" ", "");
						// 判断字符串是否以‘#’开始
						if (entityContent.charAt(0) == '#') {
							if (entityContentLen > 1) {
								char isHexChar = entityContent.charAt(1);
								try {
									switch (isHexChar) {
									case 88: // 'X'
									case 120: // 'x'
										entityValue = Integer.parseInt(entityContent.substring(2), 16);
										break;
									default:
										// 获取10进制数字
										entityValue = Integer.parseInt(entityContent.substring(1), 10);
										break;
									}
									if (entityValue > 65535)
										entityValue = -1;
								} catch (NumberFormatException e) {
									entityValue = -1;
								}
							}
						}
					}
					// entityValue = -1 时，表示字符未做改变,直接输出
					if (entityValue == -1) {
						stringWriter.write(38);
						stringWriter.write(entityContent);
						stringWriter.write(59);
					} else {
						// 输出解码后的char
						stringWriter.write(entityValue);
					}
					i = semiColonIdx;
				} else {
					// 判断单个字符是否是&,为 false 时，直接输出&
					stringWriter.write(c);
				}
			}
			// 返回string类型数据
			return stringWriter.toString();
		} catch (Exception e) {
			return str;
		}
	}

	/**
	 * 【日期处理】通过日期参数返回格式化日期字符串
	 * 
	 * @param date
	 *            日期 （例：2012-10-29 11:46:23）
	 * @param format
	 *            日期格式字符串 （例：yyyy-MM-dd hh:mm:ss 默认）
	 * @return 返回的日期格式字符串 （例：yyyy-MM-dd hh:mm:ss 默认）
	 */
	public static String toDate(Date date, String format) {
		if (date != null) {
			if (format == null || "".equals(format)) {
				format = "yyyy-MM-dd";
			}
			return DateFormatUtils.format(date, format);
		} else {
			return "";
		}
	}

}
